home *** CD-ROM | disk | FTP | other *** search
/ BCI NET / BCI NET Dec 94.iso / archives / programming / e / mui22edev2.lha / Amiga_E / Sources / PopUp.e < prev    next >
Text File  |  1994-10-10  |  8KB  |  303 lines

  1. /*
  2. **    Original C Code written by Stefan Stuntz
  3. **
  4. **    Translation into E by Jan Hendrik Schulz
  5. **
  6. */
  7.  
  8.  
  9. /*
  10. ** Loading the needed MODULEs
  11. */
  12.  
  13. MODULE 'muimaster', 'libraries/mui'
  14. MODULE 'utility/tagitem', 'utility/hooks'
  15. MODULE 'intuition/classes', 'intuition/classusr'
  16. MODULE 'libraries/asl'
  17.  
  18.  
  19. /*
  20. ** defining some CONSTs
  21. */
  22.  
  23. ENUM ER_NON, ER_MUILIB, ER_APP
  24.  
  25.  
  26. /*
  27. ** Now the two hook-functions
  28. */
  29.  
  30. PROC hook_StrObjFunc(pop,str)
  31.  
  32.    DEF x,s,i
  33.  
  34.    GetAttr(MUIA_String_Contents,str,{s})
  35.  
  36.    i:=0
  37.    LOOP
  38.       doMethod(pop,[MUIM_List_GetEntry,i,{x}])
  39.  
  40.       IF x=NIL
  41.  
  42.      SetAttrsA(pop,[Eval(`(MUIA_List_Active)),MUIV_List_Active_Off,TAG_DONE])
  43.      RETURN MUI_TRUE
  44.  
  45.       ELSEIF StrCmp(x,s,ALL)
  46.  
  47.      SetAttrsA(pop,[Eval(`(MUIA_List_Active)),i,TAG_DONE])
  48.      RETURN MUI_TRUE
  49.  
  50.       ENDIF
  51.    INC i
  52.    ENDLOOP
  53. ENDPROC
  54.  
  55.  
  56. PROC hook_ObjStrFunc(pop,str)
  57.  
  58.    DEF x
  59.  
  60.    doMethod(pop,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{x}])
  61.    SetAttrsA(str,[Eval(`(MUIA_String_Contents)),x,TAG_DONE])
  62.  
  63. ENDPROC
  64.  
  65.  
  66. /*
  67. ** main PROC with exception handling
  68. */
  69.  
  70. PROC main() HANDLE
  71.  
  72.    DEF popNames
  73.    DEF hookStrObj:hook, hookObjStr:hook
  74.    DEF app,window,pop1,pop2,pop3,pop4,pop5,plist
  75.    DEF signals, result, active, running=TRUE
  76.  
  77. /*
  78. ** creating the hooks
  79. */
  80.  
  81.    installhook(hookStrObj, {hook_StrObjFunc})
  82.    installhook(hookObjStr, {hook_ObjStrFunc})
  83.  
  84. /*
  85. ** creating array for PopUp
  86. */
  87.  
  88.   popNames := [ 'Stefan Becker',
  89.         'Martin Berndt',
  90.         'Georg Heßmann',
  91.         'Martin Horneffer',
  92.         'Martin Huttenloher',
  93.         'Kai Iske',
  94.         'Oliver Kilian',
  95.         'Franke Mariak',
  96.         'Klaus Melchior',
  97.         'Armin Sander',
  98.         'Matthias Scheler',
  99.         'Andreas Schildbach',
  100.         'Wolfgang Schildbach',
  101.         'Christian Scholz',
  102.         'Markus Stipp',
  103.         'Ibrahim Solmaz',
  104.         'Henri Veistera',
  105.         'Alber Weinert',
  106.         NIL ]
  107.  
  108. /*
  109. ** open muimaster.library
  110. */
  111.  
  112.    IF (muimasterbase := OpenLibrary('muimaster.library',MUIMASTER_VMIN))=NIL THEN Raise(ER_MUILIB)
  113.  
  114. /*
  115. ** creating the application
  116. */
  117.  
  118.    app := Mui_NewObjectA('Application.mui',[TAG_IGNORE,0,
  119.     MUIA_Application_Title      , 'Popup-Demo',
  120.     MUIA_Application_Version    , '$VER: Popup-Demo 8.37 (03.07.94)',
  121.     MUIA_Application_Copyright  , '©1993, Stefan Stuntz',
  122.     MUIA_Application_Author     , 'Stefan Stuntz',
  123.     MUIA_Application_Description, 'Demostrate popup objects.',
  124.     MUIA_Application_Base       , 'POPUP',
  125.  
  126.     MUIA_Application_Window, window := Mui_NewObjectA('Window.mui',[TAG_IGNORE,0,
  127.         MUIA_Window_Title, 'Popup Objects',
  128.         MUIA_Window_ID   , "POPP",
  129.         MUIA_Window_RootObject, Mui_NewObjectA('Group.mui',[TAG_IGNORE,0,
  130.  
  131.         MUIA_Group_Child, Mui_NewObjectA('Group.mui',[MUIA_Group_Columns,(2),
  132.  
  133.             MUIA_Group_Child, Mui_MakeObjectA(MUIO_Label,['File:',Or(MUIO_Label_DoubleFrame,"f")]),
  134.             MUIA_Group_Child, pop1 := Mui_NewObjectA('Popasl.mui',[TAG_IGNORE,0,
  135.             MUIA_Popstring_String, Mui_NewObjectA('String.mui',[TAG_IGNORE,0,MUIA_Frame, MUIV_Frame_String,MUIA_ControlChar    , "f",MUIA_String_MaxLen  , 256,MUIA_String_Contents, 0,TAG_DONE]),
  136.             MUIA_Popstring_Button, Mui_MakeObjectA(MUIO_PopButton,[MUII_PopFile]),
  137.             ASLFR_TITLETEXT, 'Please select a file...',
  138.             TAG_DONE]),
  139.  
  140.             MUIA_Group_Child, Mui_MakeObjectA(MUIO_Label,['Drawer:',Or(MUIO_Label_DoubleFrame,"d")]),
  141.             MUIA_Group_Child, pop2 := Mui_NewObjectA('Popasl.mui',[TAG_IGNORE,0,
  142.             MUIA_Popstring_String, Mui_NewObjectA('String.mui',[TAG_IGNORE,0,MUIA_Frame, MUIV_Frame_String,MUIA_ControlChar    , "d",MUIA_String_MaxLen  , 256,MUIA_String_Contents, 0,TAG_DONE]),
  143.             MUIA_Popstring_Button, Mui_MakeObjectA(MUIO_PopButton,[MUII_PopDrawer]),
  144.             ASLFR_TITLETEXT  , 'Please select a drawer...',
  145.             ASLFR_DRAWERSONLY, MUI_TRUE,
  146.             TAG_DONE]),
  147.  
  148.             MUIA_Group_Child, Mui_MakeObjectA(MUIO_Label,['Font:',Or(MUIO_Label_DoubleFrame,"o")]),
  149.             MUIA_Group_Child, pop3 := Mui_NewObjectA('Popasl.mui',[TAG_IGNORE,0,
  150.             MUIA_Popstring_String, Mui_NewObjectA('String.mui',[TAG_IGNORE,0,MUIA_Frame, MUIV_Frame_String,MUIA_ControlChar    , "o",MUIA_String_MaxLen  , 80,MUIA_String_Contents, 0,TAG_DONE]),
  151.             MUIA_Popstring_Button, Mui_MakeObjectA(MUIO_PopButton,[MUII_PopUp]),
  152.             MUIA_Popasl_Type , ASL_FONTREQUEST,
  153.             ASLFO_TITLETEXT  , 'Please select a font...',
  154.             TAG_DONE]),
  155.  
  156.             MUIA_Group_Child, Mui_MakeObjectA(MUIO_Label,['Fixed Font:',Or(MUIO_Label_DoubleFrame,"i")]),
  157.             MUIA_Group_Child, pop4 := Mui_NewObjectA('Popasl.mui',[TAG_IGNORE,0,
  158.             MUIA_Popstring_String, Mui_NewObjectA('String.mui',[TAG_IGNORE,0,MUIA_Frame, MUIV_Frame_String,MUIA_ControlChar    , "i",MUIA_String_MaxLen  , 80,MUIA_String_Contents, 0,TAG_DONE]),
  159.             MUIA_Popstring_Button, Mui_MakeObjectA(MUIO_PopButton,[MUII_PopUp]),
  160.             MUIA_Popasl_Type , ASL_FONTREQUEST,
  161.             ASLFO_TITLETEXT  , 'Please select a fixed font...',
  162.             ASLFO_FIXEDWIDTHONLY, MUI_TRUE,
  163.             TAG_DONE]),
  164.  
  165.             MUIA_Group_Child, Mui_MakeObjectA(MUIO_Label,['Thanks To:',Or(MUIO_Label_DoubleFrame,"n")]),
  166.             MUIA_Group_Child, pop5 := Mui_NewObjectA('Popobject.mui',[TAG_IGNORE,0,
  167.             MUIA_Popstring_String, Mui_NewObjectA('String.mui',[TAG_IGNORE,0,MUIA_Frame, MUIV_Frame_String,MUIA_ControlChar    , "n",MUIA_String_MaxLen  , 60,MUIA_String_Contents, 0,TAG_DONE]),
  168.             MUIA_Popstring_Button, Mui_MakeObjectA(MUIO_PopButton,[MUII_PopUp]),
  169.             MUIA_Popobject_StrObjHook, hookStrObj,
  170.             MUIA_Popobject_ObjStrHook, hookObjStr,
  171.             MUIA_Popobject_Object, plist := Mui_NewObjectA('Listview.mui',[TAG_IGNORE,0,
  172.                 MUIA_Listview_List, Mui_NewObjectA('List.mui',[TAG_IGNORE,0,
  173.                 MUIA_Frame, MUIV_Frame_InputList,
  174.                 MUIA_List_SourceArray, popNames,
  175.                 TAG_DONE]),
  176.             TAG_DONE]),
  177.             TAG_DONE]),
  178.         TAG_DONE]),
  179.         TAG_DONE]),
  180.     TAG_DONE]),
  181.     TAG_DONE])
  182.  
  183.    IF app=NIL THEN Raise(ER_APP)
  184.  
  185.    doMethod(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,
  186.         app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
  187.  
  188.    doMethod(window,[MUIM_Window_SetCycleChain,pop1,pop2,pop3,pop4,pop5,NIL])
  189.  
  190.    /* A double click terminates the popping list with a successful return value. */
  191.    doMethod(plist,[MUIM_Notify,MUIA_Listview_DoubleClick,MUI_TRUE,
  192.         pop5,2,MUIM_Popstring_Close,MUI_TRUE])
  193.  
  194. /*
  195. ** Input loop...
  196. */
  197.  
  198.    SetAttrsA(window,[Eval(`(MUIA_Window_Open)),MUI_TRUE,TAG_DONE]);
  199.  
  200.    WHILE running
  201.  
  202.       result := doMethod(app,[MUIM_Application_Input,{signals}])
  203.    
  204.       SELECT result
  205.  
  206.      CASE MUIV_Application_ReturnID_Quit
  207.  
  208.          GetAttr(MUIA_Popasl_Active,pop1,{active})
  209.          IF active=FALSE THEN GetAttr(MUIA_Popasl_Active,pop2,{active})
  210.          IF active=FALSE THEN GetAttr(MUIA_Popasl_Active,pop3,{active})
  211.          IF active=FALSE THEN GetAttr(MUIA_Popasl_Active,pop4,{active})
  212.  
  213.          IF active
  214.         Mui_RequestA(app,window,0,NIL,'OK','Cannot quit now, still\nsome asl popups opened.',NIL)
  215.          ELSE
  216.         running := FALSE
  217.          ENDIF
  218.        ENDSELECT
  219.  
  220.        IF running OR signals THEN Wait(signals)
  221.    ENDWHILE
  222.  
  223.    SetAttrsA(window,[Eval(`(MUIA_Window_Open)),FALSE,TAG_DONE])
  224.  
  225. /*
  226. ** Shut down...
  227. */
  228.  
  229.    Raise(ER_NON)
  230.  
  231. EXCEPT
  232.  
  233.   IF app THEN Mui_DisposeObject(app)
  234.   IF muimasterbase THEN CloseLibrary(muimasterbase)
  235.   
  236.   SELECT exception
  237.     CASE ER_MUILIB
  238.       WriteF('Failed to open \s.\n','muimaster.library')
  239.       CleanUp(20)
  240.  
  241.     CASE ER_APP
  242.       WriteF('Failed to create application.\n')
  243.       CleanUp(20)
  244.       
  245.   ENDSELECT
  246. ENDPROC 0
  247.  
  248.  
  249. /*
  250. ** doMethod (written by Wouter van Oortmerssen)
  251. */
  252.  
  253. PROC doMethod( obj:PTR TO object, msg:PTR TO msg )
  254.  
  255.     DEF h:PTR TO hook, o:PTR TO object, dispatcher
  256.  
  257.     IF obj
  258.         o := obj-SIZEOF object    /* instance data is to negative offset */
  259.         h := o.class
  260.         dispatcher := h.entry    /* get dispatcher from hook in iclass */
  261.         MOVEA.L h,A0
  262.         MOVEA.L msg,A1
  263.         MOVEA.L obj,A2        /* probably should use CallHookPkt, but the */
  264.         MOVEA.L dispatcher,A3    /*   original code (DoMethodA()) doesn't. */
  265.         JSR (A3)        /* call classDispatcher() */
  266.         MOVE.L D0,o
  267.         RETURN o
  268.     ENDIF
  269. ENDPROC NIL
  270.  
  271.  
  272. /*
  273. ** installhook (written by Wouter van Oortmerssen)
  274. */
  275.  
  276. PROC installhook(hook,func)
  277.     DEF r
  278.     MOVE.L hook,A0
  279.     MOVE.L func,12(A0)
  280.     LEA hookentry(PC),A1
  281.     MOVE.L A1,8(A0)
  282.     MOVE.L A4,16(A0)
  283.     MOVE.L A0,r
  284. ENDPROC r
  285.  
  286. hookentry:
  287.    MOVEM.L D2-D7/A2-A6,-(A7)
  288.    MOVE.L 16(A0),A4
  289. /* MOVE.L A0,-(A7)    I never need a PTR to the hook-structure in my
  290.               hook-functions! therefore I removed this.*/
  291.    MOVE.L A2,-(A7)
  292.    MOVE.L A1,-(A7)
  293.    MOVE.L 12(A0),A0
  294.    JSR (A0)
  295.    LEA 8(A7),A7     /* Changed from LEA 12... to LEA 8... because of
  296.                the removed MOVE above */
  297.    MOVEM.L (A7)+,D2-D7/A2-A6
  298. RTS
  299.  
  300. /*
  301. ** End Of File
  302. */
  303.